// #include <assert.h>
// #include <stdio.h>
// #include <stdlib.h>
// #include <string.h>
//
// //位段 特殊的结构体  定义的方式和普通的结构体方式不一样
//
// struct Flag {
//     // : 后面的数字代表的是变量占用内存是多少个二进制位
//     //超出了存储范围会溢出
//     unsigned int a:3; //3个二进制位 --- 000 111
//     unsigned int b:2; //2个二进制位 -- 00 11
//     unsigned int c:3; // 3个二进制位 --- 000 111
// };
// //共用体和枚举类型
// //怎么创建枚举类型
// //enum 标识符{符号...}
// //默认从0开始 Red=0 Blue=1 Yellow=2 Green=3
// //增肌代码的可读性
// enum Color {
//     Red,
//     Blue,
//     Yellow,
//     Green
// };
//
// //没有初始化的是前面初始的加1 Right=76 Up=81
// enum Dir{Left=75, Right, Down=80, Up};
// //c语言枚举类型当函数参数 是可以传入整形变量的
// void printFlag(enum Color color, enum Dir dir) {
//     printf("%c", ((color == Red) ? 'r' : 'b'));
//     printf("%c", ((dir == Left) ? 'l' : 'd'));
// }
// //共用体->联合体
// //所以变量共用同一块内存
// union Value {
//     char name[20];
//     int age;
// };
//
// void test_union() {
//     //不能同时初始化两个变量
//     //union Value value = {"A",65};
//     union Value value;
//     // strcpy(value.name, "name");
//     // printf("name: %s\n", value.name);
//     // printf("age: %d\n", value.age);
//     value.age = 65;
//     printf("%d\n", value.age);
//     printf("%s\n", value.name);
//
// }
//
// //结构体嵌套
// //推荐嵌套
// struct Score {
//     int math;
//     int english;
//     int py;
// };
//
// struct Info {
//     char name[20];
//     int age;
//     char addr[20];
//     char tel[15];
// };
//
// struct  student {
//     struct Info info;
//     struct Score score;
// };
//
//
// //直接包含
// struct A {
//     int a;
//     struct B {
//         int aa;
//     } b;
// };
//
// //结构体里面包含指针
//
// struct MM {
//     char* name;
//     int age;
// };
//
// struct MM* create_mm(const char* name,int age) {
//     struct MM* temp=(struct MM*)malloc(sizeof(struct MM));
//     assert(temp);
//     //做包含指针的二次申请
//     //strcpy(temp->name,name);
//     int length = strlen(name)+1;
//     temp->name=(char*)malloc(length*sizeof(char));
//     strcpy(temp->name,name);
//     temp->age=age;
//     return temp;
// }
// //结构体内存问题
// //具体占用内存其实没那么重要 怎么写才省内存
//
// //内存对齐 位置不同 导致多8字节
// //按照类型最长的补齐
//
//
//
//
//
//
//
//
// int main() {
//
//     // struct Flag f;
//     // f.a = 5;
//     // f.b=1;
//     // f.c = 8;
//     // printf("%u\n", f.c); // ____ 1000 超过范围 不管 打印为0
//     // printf("%u\n", f.b);
//     // printf("%u\n", f.a); //溢出是环形处理
//     //
//     // printf("Red%d\n",Red);
//     // printf("Blue%d\n",Blue);
//     // printf("Yellow%d\n",Yellow);
//     // printf("Green%d\n",Green);
//
//
//
//     // test_union();
//
//     // struct student student = {{"xiaofang",16,"abc","1323"},{88,100,100}};
//     //
//     // printf("%d\n", student.info.age);
//     // printf("%d\n", student.score.math);
//     // printf("%d\n", student.score.english);
//     // printf("%d\n", student.score.py);
//     // printf("%s\n", student.info.name);
//
//
//     struct MM one={"Illoveyou",19};
//     struct MM two={"Hellossss",30};
//     struct MM temp = one;
//     one=two;
//     two=temp;
//     printf("%d\n", one.age);
//     printf("%s\n", one.name);
//     printf("%d\n", two.age);
//     printf("%s\n", two.name);
//     //这个操作就是错的
//     //加上下面这两句就没问题了
//     one.name=(char*)malloc(20);
//     assert(one.name);
//     //name是指针 没有内存
//     strcpy(one.name,"sss");
//     printf("%s\n", one.name);
//
//
//
//     printf("%d\n", sizeof(struct student));
//
//
//
//     return 0;
// }